package main

import "fmt"

/*
  第3章 内建容器
  一、数组
  1.定义数组
  (1) 数量写在类型前
  2.数组的遍历
  len遍历,range遍历
  (1) 可通过_省略变量
  (2) 不仅range，任何地方都可通过_省略变量
  (3) 如果只要i，可写成 for i := range numbers
  3.为什么要用range
  (1) 意义明确，美观
  (2) C++∶没有类似能力
  (3) Java/Python:只能for each value，不能同时获取i, v
  4.数组是值类型
  (1) [10]int和[20]int是不同类型
  (2) 调用func f(arr [10]int)会拷贝数组
  (3) 在go语言中一般不直接使用数组,使用切片
*/
func main() {
	definitionAndForeach()

	var arr1 [5]int
	arr3 := [...]int{2, 4, 6, 8, 10}
	//fmt.Println("printArray(arr1)")
	//printArray(arr1)
	//fmt.Println("printArray(arr3)")
	//printArray(arr3)
	//fmt.Println("arr1 and arr3")
	//fmt.Println(arr1, arr3)

	fmt.Println("printArray(arr1)")
	printArray2(&arr1)
	fmt.Println("printArray(arr3)")
	printArray2(&arr3)
	fmt.Println("arr1 and arr3")
	fmt.Println(arr1, arr3)

}

// 1.数组的定义和遍历
func definitionAndForeach() {
	// 定义数组，并赋初值
	var arr1 [5]int
	arr2 := [3]int{1, 3, 5}
	arr3 := [...]int{2, 4, 6, 8, 10}
	fmt.Println(arr1, arr2, arr3)

	var grid [4][5]int
	fmt.Println(grid)

	// 1.首先想到的遍历方法
	for i := 0; i < len(arr3); i++ {
		fmt.Println(arr3[i])
	}
	// 2.range遍历方法
	for i := range arr3 {
		fmt.Println(arr3[i])
	}
	for i, v := range arr3 {
		fmt.Println(i, v) // 取键值
	}
	// 2.range遍历方法
	for _, v := range arr3 {
		fmt.Println(v) // 取值
	}
}

// 2.数组是值类型
func printArray(arr [5]int) { // arr [5]int 数组，arr []int切片
	arr[0] = 100 // 值类型 arr[0]不改变
	for i, v := range arr {
		fmt.Println(i, v)
	}
}

// 指针
func printArray2(arr *[5]int) { // arr [5]int 数组，arr []int切片
	arr[0] = 100 // 值类型 arr[0]不改变
	for i, v := range arr {
		fmt.Println(i, v)
	}
}
